#include <iostream>

#include <stdio.h>
#include <stdlib.h>

float const temp2res[] =
{
	96.09,  96.48,  96.87,  97.26,  97.65,  98.04,  98.44,  98.83,  99.22,  99.61,	// -10 ~ -1
	100.00, 100.39, 100.78, 101.17, 101.56, 101.95, 102.34, 102.73, 103.12, 103.51,	// 0~9
	103.90, 104.29, 104.68, 105.07, 105.46, 105.85, 106.24, 106.63, 107.02, 107.40,	// 10~19
	107.79, 108.18, 108.57, 108.96, 109.35, 109.73, 110.12, 110.51, 110.90, 111.29,	// 20~29
	111.67, 112.06, 112.45, 112.83, 113.22, 113.61, 114.00, 114.38, 114.77, 115.15,	// 30~39
	115.54, 115.93, 116.31, 116.70, 117.08, 117.47, 117.86, 118.24, 118.63, 119.01,	// 40~49
	119.40, 119.78, 120.17, 120.55, 120.94, 121.32, 121.71, 122.09, 122.47, 122.86,	// 50~59
	123.24, 123.63, 124.01, 124.39, 124.78, 125.16, 125.54, 125.93, 126.31, 126.69,	// 60~69
	127.08, 127.46, 127.84, 128.22, 128.61, 128.99, 129.37, 129.75, 130.13, 130.52,	// 70~79
	130.90, 131.28, 131.66, 132.04, 132.42, 132.80, 133.18, 133.57, 133.95, 134.33,	// 80~89
	134.71, 135.09, 135.47, 135.85, 136.23, 136.61, 136.99, 137.37, 137.75, 138.13,	// 90~99
	138.51, 138.88, 139.26, 139.64, 140.02, 140.40, 140.78, 141.16, 141.54, 145.69, // 100~109
	142.29,	142.67,	143.05,	143.43,	143.80,	144.18,	144.56,	144.94,	145.31,	145.69,	// 110~119
	146.07,	146.44,	146.82,	147.20,	147.57, 147.95, 148.33, 148.70, 149.08, 149.49,	// 120~129
	149.83, 150.21, 150.58, 150.96, 151.33, 151.71, 152.08, 152.46, 152.83, 153.21, // 130~139
	153.58, 153.96, 154,33, 154.71, 155.08, 155.46, 155.83, 156.20, 156.58, 156.95, // 140~149
	157.33, 157.70, 158.07, 158.45, 158.82, 159.19, 159.56, 159.94, 160.31, 160.68, // 150~159
	161.05, 161.43, 161.80, 162.17, 162.54, 162.91, 163.29, 163.66, 164.03, 164.40, // 160~169
	164.77, 165.14, 165.51, 165.89, 166.26, 166.63, 167.00, 167.37, 167.74, 168.11,	// 170~179
	168.48, 168.85, 169.22, 169.59, 169.96, 170.33, 170.70, 171.07, 171.43, 171.80,	// 180~189
	172.17, 172.54, 172.91, 173.28, 173.65, 174.02, 174.38, 174.75, 175.12, 175.49	// 190~199
};

//#define _GP_1 1

#define Au	10

unsigned short convertTempToVoltage(float tempIn)
{
	float resRead = 0;
	float delta = 0;
	float resCalc = 0;

	unsigned short retValue = 0;

    float valtageCalc = 0;
	int i = (int)(tempIn+10);

    printf("index is %d\n",i);

	if(tempIn<-10 || tempIn>199)
    {
        return 0;
    }

	resRead = temp2res[i];

	delta = tempIn - i + 10;
	resCalc = resRead + delta*0.385;

    printf("resRead:%f,delta:%f,rescalc:%f\n",resRead,delta,resCalc);
#ifdef _GP_1
	valtageCalc = resCalc*0.00124*Au*65535.00/4.09600;
#else
	valtageCalc = resCalc*0.001*Au*65535.00/4.09600;
#endif

	retValue = (unsigned short)valtageCalc;

    return retValue;
}


#define Au		10	// 放大倍数


float convertTemperature(unsigned short adc)
{
	float res;	// 电阻值
	unsigned char i;	// 循环比较次数，也就是温度，步长1°C
	
	
	//res = adc * 4.09600 / 65535.00000 / Au / 0.00124;

#ifdef _GP_1	
	res = adc * 4.09600 / 65535.00000 / Au / 0.00124;
#else
    res = adc * 4.096 / 65535.00000 / Au / 0.001;
#endif
//	switch(position)
//	{
//#if 1
//		case 1:	res -= 0.988;break;
//		case 2: res -= 2.07;break;
//		case 3: res -= 1.515;break;
//		case 4: res -= 1.66;break;
//#else
//		case 1:	res -= 0.947;break;
//		case 2: res -= 2.07;break;
//		case 3: res -= 1.47;break;
//		case 4: res -= 1.66;break;
//#endif
//		default:break;
//	}
//	printf("\r\n red%d = %5.2f",position,res);
	if(res > 175.49f)	// 199°C
		return 999.99;
	
	for(i = 0;i < 210;i++)
	{
		if(res == temp2res[i])
		{
			if(i < 10)	// 零下
				return i * 1.00f - 10.00f;
			else
				return i * 1.00f - 10.00f;
		}
		if(res > temp2res[i] && res < temp2res[i + 1])
		{
			if(i < 10) // 零下
			{
				return (res - temp2res[i]) / (temp2res[i + 1] - temp2res[i]) * 1.00f + i * 1.00f - 10.00f;
			}
			else
				return (res - temp2res[i]) / (temp2res[i + 1] - temp2res[i]) * 1.00f + i * 1.00f - 10.00f;
		}
	}
	return -10.00;
}

int main(int argc, char *argv[])
{
    if(argc<3)
	{
		printf("eg, pt100 choice value\n");
		printf("choice:1, convert from valtage to temperature\n");
		printf("choice:2, convert from temperature to valtage\n");
		return 1;

	}

	if(argv[1][0] == '1')
	{
		unsigned long valtage = strtoul(argv[2],NULL,0);
		float temperature = convertTemperature(valtage);
		printf("temp converted is %f\n",temperature);
	}
	else if(argv[1][0] == '2')
	{		
		float temperature = strtof(argv[2],NULL);
		unsigned long valtage = convertTempToVoltage(temperature);
		printf("voltage converted is %lu\n",valtage);
	}
	// float temprature = 3.0;

    // unsigned short voltage = convertTempToVoltage(temprature);
   

    // printf("temp:%f,to voltage:%04x\n",temprature,voltage);

    // unsigned short voltageLtc = 0x5642;

    // float tempCalc = convertTemperature(voltageLtc);

    // printf("voltage:%04x to temp:%f\n",voltageLtc,tempCalc);

	// short delta = convertTempToVoltage(3.0) - convertTempToVoltage(2.0);

	// printf("delta is %d\n",delta);
	return 0;
}


